package com.domain;

import com.dequeue.DeQueueList;
import com.queue.PriorityQueueList;
import com.stack.StackList;

public class Aeropuerto {
	static final int CAPACIDAD_ESTACIONAMIENTO = 16;
	private StackList auxStack;
	private DeQueueList taxiLane;
	private PriorityQueueList holdingPattern;

	public final boolean TAXI_LANE_IS_FULL = true;

	public Aeropuerto() {
		auxStack = new StackList();
		taxiLane = new DeQueueList();
		holdingPattern = new PriorityQueueList();
	}

	public boolean llegada(Avion nuevo) {
		if (taxiLane.size() == CAPACIDAD_ESTACIONAMIENTO) {
			holdingPattern.insertItem(nuevo, nuevo.getCantidadFuel());
			return TAXI_LANE_IS_FULL;
		} else {
			taxiLane.insertFirst(nuevo);
			return !TAXI_LANE_IS_FULL;
		}
	}

	public boolean salida() throws EmptyParkException {
		if (taxiLane.isEmpty())
			throw new EmptyParkException();

		// Avion despegando = (Avion)

		taxiLane.removeFromLast();

		if (!holdingPattern.isEmpty()) {
			taxiLane.insertFirst(holdingPattern.removeMinElement());
			return true;
		} else {
			return false;
		}
	}

	public Avion retirar(String matricula) throws EmptyParkException {
		if (taxiLane.isEmpty())
			throw new EmptyParkException();

		while (!taxiLane.isEmpty()
				&& !((Avion) taxiLane.last()).getNumMatricula().equals(
						matricula)) {
			auxStack.push(taxiLane.removeFromLast());
		}

		Avion objetoRemovido = null;
		if (!taxiLane.isEmpty())
			objetoRemovido = (Avion) taxiLane.removeFromLast();

		while (!auxStack.isEmpty()) {
			taxiLane.insertLast(auxStack.pop());
		}

		return objetoRemovido;
	}

	/*
	 * aeropuerto.estacionamiento.getListaDoble().printBack();
	 * aeropuerto.retirar("coma");
	 * aeropuerto.estacionamiento.getListaDoble().printBack();
	 */

	public PriorityQueueList getEnEspera() {
		return holdingPattern;
	}

	public DeQueueList getEstacionamiento() {
		return taxiLane;
	}

	public StackList getPila() {
		return auxStack;
	}

}
